iT邦幫忙

2024 iThome 鐵人賽

DAY 20
0

defer 對於 C 和 Rust 的使用者是個比較陌生的語法,它是用來在離開目前的作用域(Scope)時自動執行表達式(expression)。

它通常用來處理資源釋放。只要在分配資源程式下增加一個 defer,就可以確保程式離開 Scope 後會呼叫 defer 並釋放資源。

基礎

語法爲 defer expression。在離開該 defer 所在的 Scope (例如 {} 或函式)時會自動執行所接的 expression。

const print = @import("std").debug.print;

pub fn main() !void {
    var x: u8 = 10;
    {
        defer x += 1;
        print("X: {}\n", .{x});
    }
    print("X: {}\n", .{x});
}
X: 10
X: 11

順序

如果有多個 defer,會以相反的順序執行。

以此例來說,會先執行 x *= 2,再執行 x += 1

const print = @import("std").debug.print;

pub fn main() !void {
    var x: u8 = 10;
    {
        defer x += 1;
        defer x *= 2;
        print("X: {}\n", .{x});
    }
    print("X: {}\n", .{x});
}
X: 10
X: 21

區塊

如果要執行的表達式有多行,也可以使用 { } 包圍它們。請注意此處的輸出結果和執行順序!

const print = @import("std").debug.print;

pub fn main() !void {
    var x: u8 = 10;
    {
        defer {
            x += 1;
            x *= 2;
        }
        print("X: {}\n", .{x});
    }
    print("X: {}\n", .{x});
}
X: 10
X: 22

函式

函式也算是 Scope,離開函式時也會觸發 defer

const print = @import("std").debug.print;

var x: u8 = 10;

pub fn main() !void {
    foo();
    print("X: {}\n", .{x});
}

fn foo() void {
    defer x += 1;
    print("X: {}\n", .{x});
}
X: 10
X: 11

參考

本文以 Zig 0.13.0 爲主。並同時發佈在:


上一篇
Zig:向量(Vector)
下一篇
Zig:分配器(Allocator)
系列文
Zig 語言入門指南——聽説你是現代化的 C30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言